/*
 *  NetTalk.h
 *  NetTalk
 *
 *  Created by Andrey on 22/09/2008.
 *  Copyright 2008 ИУ7-2003. All rights reserved.
 *
 */

/**	\file NetTalk.h
	\brief Файл, содержащий описания структур данных и функций, составлющих
	интерфейс к библиотеке NetTalk.
 
	Библиотека NetTalk представляет собой попытку создания сетевого интерфейса с
	«человеческим лицом» (по мнению автора). По задумке, разрабатываемый интерфейс
	не должен был являться слишком «толстой прослойкой» между BSD-сокетами и 
	прикладной программой, использующей библиотеку NetTalk; однако в то же время
	библиотека должна предоставлять прикладной программе удобный и лаконичный 
	интерфейс сетевого взаимодействия, а именно: прикладная программа может 
	получать уведомления о подключении или отключении клиента, а также о получении
	данных от клиента. Кроме того, прикладная программа, использующая библиотеку
	NetTalk, оперирует не дескрипторами сокетов, а строковым представлением 
	IP-адресов клиентов, а отправляемые и принимаемые данные находятся в обёртке
	из структур DataBuffer. 
 */
#pragma once

#include "DataBuffer.h"

/**	\typedef typedef void (*ClientConnectionCallback)(AsciiStringPtr clientAddress);
	\brief Вводит новый тип callback-функции -- функция, вызываемая при подключении
	нового клиента.
 */
typedef void (*ClientConnectionCallback)(AsciiStringPtr clientAddress);
/**	\typedef typedef void (*ClientDisconnectionCallback)(AsciiStringPtr clientAddress);
	\brief Вводит новый тип callback-функции -- функция, вызываемая при отключении 
	клиента.
 */
typedef void (*ClientDisconnectionCallback)(AsciiStringPtr clientAddress);
/**	\typedef void (*DataReceivedCallback)(AsciiStringPtr clientAddress, DataBuffer receivedData);
	\brief Вводит новый тип callback-функции -- функция, вызываемая при получении 
	данных от клиента.
 */
typedef void (*DataReceivedCallback)(AsciiStringPtr clientAddress, DataBuffer receivedData);

/**	\struct NTCallbacks
	\brief Cтруктура, хранящая указатели на callback-функции прикладной программы
 */
BEGIN_STRUCT_DECLARATION(NTCallbacks)
	ClientConnectionCallback clientConnectionCallback;
	//!< Указатель на функцию, вызываемую при подключении нового клиента
	ClientDisconnectionCallback clientDisconnectionCallback;
	//!< Указатель на функцию, вызываемую при отключении клиента
	DataReceivedCallback dataReceivedCallback;
	//!< Указатель на функцию, вызываемую при получении данных
END_STRUCT_DECLARATION(NTCallbacks)

/**	\fn void NTInit(NTCallbacksPtr callbacks);
	\brief Функция инициализации библиотеки NetTalk
	\param NTCallbacksPtr callbacks -- указатель на структуру NTCallback, содержащую
	указатели на callback-функции.
	\return Ничего
 */
void NTInit(NTCallbacksPtr callbacks);
/**	\fn void NTAwaitConnection(int port);
 \brief Функция запускает процесс ожидания подключений на указанном порту
 \param int port -- порт, на котором ожидаются подключения
 \return Ничего
 */
void NTAwaitConnection(int port);
/**	\fn void NTSendData(AsciiStringPtr clientAddress, DataBuffer dataToSend);
 \brief Функция, предназначенная для отправки данных клиенту
 \param AsciiStringPtr clientAddress -- строка, содержащая адрес клиента
 \param	DataBuffer dataToSend -- буфер, содержащий отправляемые данные
 \return Ничего
 */
void NTSendData(AsciiStringPtr clientAddress, DataBuffer dataToSend);

void NTCloseConnection(AsciiStringPtr clientAddress);

/**	\fn void NTShutdown();
 \brief Функция, завершающая работу библиотеки NetTalk
 \param Нет
 \return Ничего
 */
void NTShutdown();